package com.vote.controllers;

import java.io.BufferedReader;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.List;

import net.paoding.rose.web.Invocation;
import net.paoding.rose.web.annotation.Param;
import net.paoding.rose.web.annotation.ReqMapping;
import net.paoding.rose.web.annotation.rest.Post;
import net.sf.json.JSONObject;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;

import com.vote.model.Comment;
import com.vote.model.Questionnaire;
import com.vote.model.User;
import com.vote.services.CommentService;
import com.vote.services.OptionService;
import com.vote.services.QuestionService;
import com.vote.services.QuestionnaireService;
import com.vote.utils.HostHelper;
import com.vote.utils.JSONTransform;
public class QuestionnaireController {

    /**
     * Logger for this class
     */
    private static final Logger logger = Logger.getLogger(QuestionnaireController.class);

    @Autowired
    private QuestionnaireService questionnaireService;
    
    @Autowired
    private QuestionService questionService;
    
    @Autowired 
    private OptionService optionService;
    
    @Autowired
    private CommentService commentService;

    public String index() {
        return null;
    }

    public String createQuestionnaire(Invocation inv) {
        StringBuffer jb = new StringBuffer();
        String line = null;
        try {
            BufferedReader reader = inv.getRequest().getReader();
            while ((line = reader.readLine()) != null)
                jb.append(line);
        } catch (Exception e) { //report an error 
        }

        JSONObject jsonObject = JSONObject.fromObject(jb.toString());
        Questionnaire questionnaire = JSONTransform.JSON2Model(jsonObject);
        questionnaire.setOwnerId(1);
        try {
            //questionnaireService.insertQuestionnaire(questionnaire);
        } catch (Exception e) {
            e.printStackTrace();
            return "@fail";
        }
        return "@success";
    }
    
    @ReqMapping(path="getQuestionnaire-$qnid:\\d+")
    public Object getQuestionnaire(Invocation inv, @Param("qnid")int qnid){
        Questionnaire qn = questionnaireService.getQuestionnaireById(qnid);
        //User host = HostHelper.getHost(inv.getRequest());
        User host = new User();
        host.setUserId(1);
        if(qn == null){
            logger.info("user("+host.getUserId()+") get null questionnaire("+qnid+")");
            return null;
        }
        if(qn.getOwnerId() != host.getUserId()){
            logger.info("user("+host.getUserId()+") get questionnaire("+qnid+") for edit but not his questionnaire");
            return null;
        }
        JSONObject jo = JSONTransform.Model2JSON(qn);
        return jo;
    }
    
    @ReqMapping(path = { "questionnaire-{id:[0-9]+}.html" })
    public String getQuestionnairebyId(Invocation inv,@Param("id") int id)
    {
    	Questionnaire questionnaire=questionnaireService.getQuestionnaireById(id);
    	questionnaire.setCommentList(commentService.getCommentListByQuestionnaireId(id, 0, 20));
    	int t=questionnaire.getCommentList().size();
    	List<Questionnaire> hotQuestionnaire=questionnaireService.getHotQuestionnaireList(0, 10);
		List<Questionnaire> lastQuestionnaire=questionnaireService.getNewQuestionnaireList(0, 10);
		inv.addModel("hotQuestionnaire", hotQuestionnaire);
		inv.addModel("lastQuestionnaire", lastQuestionnaire);
		inv.addModel("questionnaire", questionnaire);
    	return "questionnaire";
    }
    
    @Post("updateQuestionnaire")
    public String updateQuestionnaire(Invocation inv)
    {
        int  questionnaireId=Integer.parseInt(inv.getRequest().getParameter("questionnaireId"));
        questionnaireService.addCount(questionnaireId);
    	int length=Integer.parseInt(inv.getRequest().getParameter("questionCount"));
    	for(int i=0;i<length;i++)
    	{
    		int j=i+1;
    		int questionId=Integer.parseInt(inv.getRequest().getParameter("questionId-"+j));
    		questionService.updateQuestionById(questionId);
    		int type=Integer.parseInt(inv.getRequest().getParameter("type-"+j));
    		if(type==1)
    		{
    			String strOptionId=inv.getRequest().getParameter("radioOption-"+j);
    			if(strOptionId!=null)
    			{
    			   int optionId=Integer.parseInt(strOptionId);
    			   optionService.updateOptionCount(optionId);
    			}
    			
    		}
    		else if(type!=1)
    		{   			
    			int checkLength=Integer.parseInt(inv.getRequest().getParameter("check-"+j));
    			for(int m=0;m<checkLength;m++)
    			{
    			
    				int n=m+1;
    				String strCheckOption=inv.getRequest().getParameter("checkOption-"+j+"-"+n);
    				if(strCheckOption!=null)
    					optionService.updateOptionCount(Integer.parseInt(strCheckOption));
    			}
    			
    		}
    		
    	}
        return "r:"+inv.getModel("HomeUrl")+"/questionnaire/questionnaire-"+questionnaireId+".html";
        	
    }
    
    
    @Post("addComment")
    public String addComment(Invocation inv,
    		@Param("toUserId") int toUserId,
    		@Param("commentText") String commentText,
    		@Param("questionnaireId") int questionnaireId)
    {
    	User user=HostHelper.getHost(inv.getRequest());
    	int fromUserId=1;
    	if(user!=null)
    		fromUserId=user.getUserId();
    	Comment comment=new Comment();
    	comment.setCommentText(commentText);
    	comment.setFromUserId(fromUserId);
    	comment.setToUserId(toUserId);
    	comment.setQuestionnaireId(questionnaireId);
    	comment.setCommentTime(new Timestamp(System.currentTimeMillis()));
    

    	
    	try {
			commentService.insertComment(comment);
			JSONObject jo = new JSONObject();
			jo.put("code", 1);
			SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm");
			jo.put("time", format.format(comment.getCommentTime()));
			return String.format("@%s", jo.toString());
		} catch (Exception e) {
			// TODO Auto-generated catch block
			JSONObject jo = new JSONObject();
			jo.put("code", 0);
			return String.format("@%s", jo.toString());
		}
    	
    }
}
